/**
 * @file sims_core.h
 * @author lrc
 * @brief
 * @version 0.1
 * @date 2023-01-01
 *
 * @copyright Copyright (c) 2023
 *
 */
#ifndef SIMS_CORE_H
#define SIMS_CORE_H

#include <vector>
#include <string>

using std::string;
using std::vector;

enum Level_EnumTypedef
{ // 优良等级
    A,
    B,
    C,
    D,
    E,
};

struct CourseStructDef
{ // 课程结构体
    CourseStructDef(string _name,
                    float _weight,
                    float _score) : name(_name),
                                    weight(_weight),
                                    score(_score){};
    string name;
    float weight;
    float score;
};

class StudentsClassDef;

// 学生列表，存储所有学生数据
typedef vector<StudentsClassDef *> StudentListType;

/**
 * @brief 学生类
 *
 */
class StudentsClassDef
{
public:
    StudentsClassDef(){};
    StudentsClassDef(string _name,
                     string _ID = "",
                     string _academy = "",
                     string _grade = "",
                     string _major = "")
        : name(_name),
          ID(_ID),
          academy(_academy),
          grade(_grade),
          major(_major){};

    ~StudentsClassDef(){};

    std::string name;    // 学生姓名
    std::string ID;      // 学生学号
    std::string academy; // 所在学院
    std::string grade;   // 年级
    std::string major;   // 专业
    std::string level;   // 优良等级

    float totalScore = 0;                        // 总分
    int rank = -1;                               // 排名
    std::vector<CourseStructDef *> coursescores; // 各科成绩

    void add_course(string _course, float _score, float _weight = 1); // 添加课程

    void set_rank(StudentListType *_stuList);             // 计算排名
    void set_level(float studentsNum);                    // 计算优良等级
    void set_courseWeight(string _course, float _weight); // 设置课程权重
    void set_courseScore(string _course, float _score);   // 设置课程成绩
    void set_totalScore();                                // 计算总分

    void set_Parameter(string parameter, string value, StudentListType *_stuList = nullptr); // 设置学生属性

    float get_courseScore(string name); // 获取某科课程成绩

    template <typename T>
    T get_Parameter(string parameter);
};

// 自定义表格中的学生属性
typedef vector<string> StudentParameterType;

// 计算科目及格率
float get_PassRate(StudentListType *stuList, string course);

// 计算科目分数层占比
float get_ScoreRate(StudentListType *stuList, string course, float down, float up);

#endif // SIMS_CORE_H
